//
//  HomeTableViewController.swift
//  Microblog
//
//  Created by steaest on 15/7/28.
//  Copyright © 2015年 steaest. All rights reserved.
//

import UIKit

class HomeTableViewController: BaseTableViewController {
    
    private var statuses: [Status]? {
        didSet {
            tableView .reloadData()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        
        if !UserAccount.userLogon  {
        visitorView?.setupViewInfo(true, imageName: "visitordiscover_feed_image_smallicon", message: "关注一些人，回这里看看有什么惊喜")
            return
        }
        prepareTableView()
        loadData()
        //refreshControl?.backgroundColor = UIColor.redColor()
    }
    
    //MARK: - 准备TableView
    private func prepareTableView() {
        //注册原型cell
        tableView.registerClass(StatusesNormalCell.self, forCellReuseIdentifier: StatusCellIdentifier.NormalCell.rawValue)
        tableView.registerClass(StatusesFowardCell.self, forCellReuseIdentifier: StatusCellIdentifier.forwardCell.rawValue)
        
        //行高固定的时候就不用再做底部约束
        tableView.rowHeight = 300
        //自动计算行高(在设置图片的时候,约束参照的是内容,内容不固定,会造成约束冲突,所以把行高固定)
        //tableView.estimatedRowHeight = 300
        //tableView.rowHeight = UITableViewAutomaticDimension
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        
        refreshControl = WWRefreshControl()
        refreshControl?.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
    }
    
    
    //上拉刷新标记
    var pullupRefreshFlag = false
    //MARK: - 加载数据
    func loadData() {
        //开始时显示刷新加载动画
        refreshControl?.beginRefreshing()
        
        //刷新数据,获取到数组中第一条记录的id
        //第一次执行此方法的时候,statuses为空since_id = 0,加载最新的20条记录
        var since_id = statuses?.first?.id ?? 0
        
        //判断是否是上拉刷新
        var max_id = 0
        if pullupRefreshFlag {
            since_id = 0
            //记录数组最后一条记录的id
            max_id = statuses?.last?.id ?? 0
        }
        
        Status.loadStatus(since_id, max_id: max_id) {(dataList, error) -> () in
            //关闭刷新控件,移除刷新动画
            self.refreshControl?.endRefreshing()
            
            if error != nil {
                print(error)
            }
            
            let count = dataList?.count ?? 0
            print("刷新到\(count)条数据")
            

            if since_id > 0 {
                self.showPullDownTipLabel(count)
            }
            
            //刷新不到数据直接返回,下边不再执行
            if count == 0 {
                return
            }
            
            if since_id > 0 {
                //刷新提示标签   只有下拉刷新才需要提示
                
                
                //微博模型数组接收数据
                self.statuses = dataList! + self.statuses!
            } else if max_id > 0{
                self.statuses! += dataList!
                //复位上拉刷新标记,保证下一次仍然能够上拉
                self.pullupRefreshFlag = false
            } else {
                self.statuses = dataList
            }
        }
    }
    
    //MARK: - 数据源方法
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        //statuses是数组才能.count
        return statuses?.count ?? 0
    }
    
   override  func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    
    let status = statuses![indexPath.row]
    
    //要注册原型cell,否则直接崩溃
        let cell = tableView.dequeueReusableCellWithIdentifier(StatusCellIdentifier.cellId(status), forIndexPath: indexPath) as! StatusesCell
        cell.statuses = statuses![indexPath.row]
    
        if indexPath.row == statuses!.count - 1 {
            //设置上拉刷新标记
            pullupRefreshFlag = true
            //刷新数据
            loadData()
    
        }
    
        return cell
    }
    
    //MARK: - 代理方法,返回行高
    /**
    行高缓存
    1.NSCache - 内存缓存,iOS 8.0有 bug,千万不要removeall,一旦removeall就无法在使用
        SDWebImage存在什么问题?
        1>,接收到内存警告之后,内存缓存失效
        2>加载GIF的时候,内存会狂飙
    2.自定义行高缓存字典
    3.直接利用微博的'模型',行高只是一个小数,不会有太多的内存消耗,不需要再控制器中,额外定义熟悉感
    
    如果表格的高度是固定的,一定不要通过代理返回行高,可以直接设置属性
    */
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        
        //1.先从模型中获取
        let status = statuses![indexPath.row]
        if let h = status.rowHeight {
            return h
        }
        
        // 2. 获取 cell - dequeueReusableCellWithIdentifier 带 indexPath 的函数会调用计算行高的方法
        // 会造成死循环，在不同版本的 Xcode 中 行高的计算次数不一样！尽量要优化！
        // 如果不做处理，会非常消耗性能！
        let cell = tableView.dequeueReusableCellWithIdentifier(StatusCellIdentifier.cellId(status)) as? StatusesCell
        
        status.rowHeight = cell?.rowHeight(status)
        
        return status.rowHeight!
    }
    
    //MARK: - 提示标签
    private func showPullDownTipLabel(count: Int) {
        
        tipLabel.text = (count == 0) ? "暂时没有新微博" : "刷新到\(count)条微博"
        
        let rect = tipLabel.frame
        
        UIView.animateWithDuration(2, animations: { () -> Void in
            // 自动反转动画
            UIView.setAnimationRepeatAutoreverses(true)
            self.tipLabel.frame = CGRectOffset(rect, 0, 3 * rect.height)
            }) { (_) -> Void in
                self.tipLabel.frame = rect
        }
        
        
    }
    
    //MARK: - 懒加载提示标签
    private lazy var tipLabel: UILabel = {
        let h: CGFloat = 44
        let label = UILabel(frame: CGRect(x: 0, y: -2 * h, width: UIScreen.mainScreen().bounds.size.width, height: h))
        label.textColor = UIColor.whiteColor()
        label.textAlignment = NSTextAlignment.Center
        label.backgroundColor = UIColor.orangeColor()
        //添加到nav上面不会随着tableView的移动而移动
        self.navigationController?.navigationBar.insertSubview(label, atIndex: 0)
        return label
        }()
}
